﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZBJF.Warranty.Common.Common
{
    public class FfmpegFileChangHelper
    {
        string massage = "";
        /// <summary>
        /// 转换音频格式
        /// </summary>
        /// <param name="FromName">需要转换的文件绝对路径</param>
        /// <param name="exportName">保存的绝对路径</param>
        public bool VoiceFileFormatChang(string fromName, string exportName)
        {
            Process p = new Process();      //建立外部调用线程
            p.StartInfo.FileName = System.Web.HttpContext.Current.Server.MapPath(@"/DownLoad/FileFormatChange/ffmpeg.exe") ;        //要调用外部程序的绝对路径
            //p.StartInfo.FileName = xml.getXML(System.Web.HttpContext.Current.Server.MapPath("ConfigFile/weixinInterface.xml"), "ffmpeg");
            p.StartInfo.Arguments = "-i  " + fromName + "  " + exportName;      //+ "  -i";//参数(这里就是FFMPEG的参数了)
            p.StartInfo.UseShellExecute = false;        //不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
            p.StartInfo.RedirectStandardError = true;       //把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的这是我耗费了2个多月得出来的经验mencoder就是用standardOutput来捕获的)
            p.StartInfo.CreateNoWindow = false;//不创建进程窗口
            p.ErrorDataReceived += new DataReceivedEventHandler(Output);        //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
            try
            {
                p.Start();//启动线程
                p.BeginErrorReadLine();//开始异步读取
                p.WaitForExit();//阻塞等待进程结束
                return true;
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("转化多媒体文件格式异常：" + ex.ToString(), LogType.error);
                return false;
            }
            finally
            {
                LogHelper.WriteLog("转化多媒体文件格式结果消息：" + massage, LogType.tag);
                p.Close();//关闭进程
                p.Dispose();//释放资源
            }
        }
        private void Output(object sendProcess, DataReceivedEventArgs output)
        {
            if (!String.IsNullOrEmpty(output.Data))
            {
                //处理方法
                massage = massage + "\n" + output.Data;//输出结果的提示
            }
        }
    }
}
